#include<stdio.h>
#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<errno.h>

int main()
{
    printf("printf1\n");
    fprintf(stdout, "fprintf1\n");
    perror("perror2");

    const char *s1 = "write1\n";
    write(1, s1, strlen(s1));

    const char *s2 = "write2\n";
    write(2, s2, strlen(s2));

    std::cout<<"cout1"<<std::endl;
    std::cerr<<"cerr2"<<std::endl;

    return 0;
}










// int main()
// {
//     close(1);
// 
//     int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT, 0666);
//     const char *mes = "hello\n";
//     write(fd, mes, strlen(mes));
// 
//     printf("out\n");
//     fflush(stdout);
// 
//     close(fd);
//     return 0;
// }


#define NUM 1024

typedef struct MyFILE
{
    int fd;
    char buf[NUM];
    int end;
}MyFILE;

MyFILE* fopen_(const char* pathname, const char* mode)
{
    assert(pathname && mode);

    MyFILE* fp = NULL;

    if(strcmp(mode, "r") == 0)
    {}
    else if(strcmp(mode, "r+") == 0)
    {}
    else if(strcmp(mode, "w") == 0)
    {
        int fd = open(pathname, O_WRONLY | O_TRUNC | O_CREAT, 0666);
        if(fd >= 0)
        {
            fp = (MyFILE*)malloc(sizeof(MyFILE));
            memset(fp, 0,sizeof(MyFILE));
            fp->fd = fd;
        }

    }
    else if(strcmp(mode, "w+") == 0)
    {}
    else if(strcmp(mode, "a") == 0)
    {}
    else if(strcmp(mode, "a+") == 0)
    {}
    else  
    {}
    return fp;
}
void fputs_(const char*message, MyFILE* fp)
{
    assert(message && fp);

    strcpy(fp->buf + fp->end, message);
    fp->end += strlen(message);


    if(fp->fd == 0)
    {
        //stdin
    }
    else if(fp->fd == 1)
    {
        //stdout
        
        if(fp->buf[fp->end - 1] == '\n')
        {
            fprintf(stderr, "fflush: %s", fp->buf);
            write(fp->fd, fp->buf, fp->end);
            fp->end = 0;
        }
    }
    else if(fp->fd == 2)
    {
        //stderr
    }
    else 
    {}

}

void fflush_(MyFILE* fp)
{
    assert(fp);

    if(fp->end)
    {
        write(fp->fd, fp->buf, fp->end);
        syncfs(fp->fd);//数据写到外设
        fp->end = 0;
    }
}

void fclose_(MyFILE* fp)
{
    assert(fp);
    fflush_(fp);
    close(fp->fd);
    free(fp);
}


// int main()
// {
//     // close(1); //重定向
//     MyFILE* fp = fopen_("./log.txt", "w");
//     if(!fp)
//     {
//         printf("error\n");
//         return 1;
//     }
//     fputs_("1 hello world\n", fp);
//     fputs_("2 hello world\n", fp);
// 
//     fork();
// 
//     fclose_(fp);
//     
//     
//     // fputs_("1 hello world", fp);
//     // sleep(1);
//     // fputs_("2 hello world\n", fp);
//     // sleep(1);
//     // fputs_("3 hello world", fp);
//     // sleep(1);
//     // fputs_("4 hello world\n", fp);
//     // sleep(1);
//     // fputs_("5 hello world", fp);
//     // sleep(1);
//     return 0;
// }







// int main()
// {
//   printf("hello printf 1\n");
//   fprintf(stdout, "hello fprintf 1\n");
// 
//   errno = 2;
//   perror("hello perror 2");
// 
//   const char *s1 = "hello write 1\n";
//   write(1, s1, strlen(s1));
// 
//   const char *s2 = "hello write 2\n";
//   write(2, s2, strlen(s2));
// 
//   std::cout << "hello cout 1" << std::endl;
//   std::cerr << "hello cerr 2" << std::endl;
// 
// 
// 
// 
//   // close(1);
//   // int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//   // if(fd < 0)
//   // {
//   //   perror("open:");
//   //   return 1;
//   // }
//   // printf("hello world: %d\n", fd);
//   // fflush(stdout);
// 
//   // close(fd);
//   // return 0;
// }
